package br.com.gemepde.utils;

import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;

import org.apache.commons.fileupload.FileItem;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

/**
 * FileUploadController
 * Faz a leitura, salva e redimensiona a imagem enviada.
 * @author alan.rodrigues
 */
public class FileController {
	
	// Faz a leitura da Imagem e atribui um Nome.
	public String lerImagem(FileUploadEvent event, String id, String pasta, boolean redimensiona){
		try {
			String [] nomeArquivo = event.getFile().getFileName().split("\\.");
			
			BufferedImage imagem = ImageIO.read(event.getFile().getInputstream());
			
			//String pastaServidor = pasta.replaceAll("/", "\\\\"); //local
			//String pastaServidor = pasta.replaceAll("/", System.getProperty("file.separator")); //local
			//String pastaServidor = pasta; //teste
			//String pastaServidor = pasta.replaceAll("/", "\\\\");
			String pastaServidor = pasta;
			// nomeArquivo[0] = nome da imagem | nomeArquivo[1] = extens�o
			
			
			// OLD - String caminhoServidorImagem = pasta + System.getProperty("file.separator") + System.currentTimeMillis()+""+id+"."+nomeArquivo[1];
			String caminhoServidorImagem = pastaServidor + System.getProperty("file.separator") + System.currentTimeMillis()+""+id+"."+nomeArquivo[1];
			String caminhoHtmlImagem = pasta + "/" + System.currentTimeMillis()+""+id+"."+nomeArquivo[1];

			salvarImagem(caminhoServidorImagem, imagem, redimensiona);
			
			return caminhoHtmlImagem;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	public String lerImagem(UploadedFile event, String id, String pasta, boolean redimensiona){
		
		try {
			if(event != null){
				String extensao = event.getFileName().substring(event.getFileName().length()-4, event.getFileName().length());;
				BufferedImage imagem = ImageIO.read(event.getInputstream());
				String pastaServidor = pasta;
				String caminhoServidorImagem = pastaServidor + System.getProperty("file.separator") + System.currentTimeMillis()+""+id;
				String caminhoHtmlImagem = pasta + "/" + System.currentTimeMillis()+""+id;
				salvarImagem(caminhoServidorImagem, imagem, redimensiona);
				return caminhoHtmlImagem;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	//TODO
	public void salvarImagem(String nomeImagem, BufferedImage imagem, boolean redimensiona){
		try {
//			FacesContext context = FacesContext.getCurrentInstance();
//			String caminhoCompleto = context.getExternalContext().getRealPath("../wiclinicimages") + System.getProperty("file.separator") + nomeImagem;
			
			
//			System.out.println("------------------------------------------------------");
			
			nomeImagem = nomeImagem.replace("/", System.getProperty("file.separator"));
			FacesContext fc = FacesContext.getCurrentInstance(); 
			ServletContext sc = (ServletContext) fc.getExternalContext().getContext();
			
			String caminhoAbsoluto = sc.getRealPath(BundleUtils.getValor("caminho.imagem"));
			
			if(caminhoAbsoluto == null){
				caminhoAbsoluto = BundleUtils.getValor("caminho.imagem.absoluto");
			}
			String caminhoCompleto = caminhoAbsoluto + System.getProperty("file.separator") + nomeImagem;
			
//			System.out.println("Caminho completo ------> " + caminhoCompleto + " <-------");
			
			File file = new File(caminhoCompleto);
			File dir = file.getParentFile();
			
			if (!dir.exists())
				dir.mkdirs();
			
			if (redimensiona)
				imagem = redimensionar(imagem);
			
			ImageIO.write(imagem, nomeImagem.split("\\.")[1], new File(caminhoCompleto));
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public BufferedImage redimensionar(BufferedImage imagem){
		BufferedImage novaImagem = new BufferedImage(150, 150, BufferedImage.TYPE_INT_RGB);
		
		novaImagem.getGraphics().drawImage(imagem, 0, 0, 150, 150, null);
		
		return novaImagem;
	}
	
	// M�todos para verifica��o de imagem
	public String retornarImagemMostrada(String imagemOriginal){
		String caminhoServidor = BundleUtils.getValor("servidor.imagem");
//		String imagemQuebrada = "pdf_gen.png";
		
		try {
			FacesContext context = FacesContext.getCurrentInstance();
			String caminhoCompletoFile = context.getExternalContext().getRealPath("../wiclinicimages") + System.getProperty("file.separator") + imagemOriginal;
			File file = new File(caminhoCompletoFile);
			
			String[] nomeArquivo = imagemOriginal.split("\\.");
			if (file.exists()){
				if(nomeArquivo[1].equals("pdf"))
					return "/wiclinic/images/pdf_icon.png";
				return caminhoServidor + "/" + imagemOriginal;
			} else {
				return "/images/user_error.png";
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public String retornaCaminhoServidor(String imagemOriginal){
		FacesContext context = FacesContext.getCurrentInstance();
		return context.getExternalContext().getRealPath("../wiclinicimages") + System.getProperty("file.separator") + imagemOriginal;
	}
	
	// M�todos para verifica��o de imagem
	public String retornarCaminhoArquivo(String imagemOriginal){
		String caminhoServidor = BundleUtils.getValor("servidor.imagem");
		String imagemQuebrada = "pdf_gen.png";
		
		try {
			FacesContext context = FacesContext.getCurrentInstance();
			String caminhoCompletoFile = context.getExternalContext().getRealPath("../wiclinicimages") + System.getProperty("file.separator") + imagemOriginal;
			File file = new File(caminhoCompletoFile);
			
			if (file.exists()){
				return caminhoServidor + "/" + imagemOriginal;
			} else {
				return "/images/user_error.png";
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	// M�todos para verifica��o de imagem
	public File retornarArquivo(String imagemOriginal){
		String caminhoServidor = BundleUtils.getValor("servidor.imagem");
		String imagemQuebrada = "pdf_gen.png";
		
		try {
			FacesContext context = FacesContext.getCurrentInstance();
			String caminhoCompletoFile = context.getExternalContext().getRealPath(BundleUtils.getValor("caminho.imagem")) + System.getProperty("file.separator") + imagemOriginal;
			File file = new File(caminhoCompletoFile);
			
			if (file.exists()){
				return file;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * Faz a leitura de um arquivo e atribui um Nome.
	 */
	public String lerArquivo(UploadedFile event, String id, String pasta){
		try {
			BufferedInputStream arquivo = new BufferedInputStream(event.getInputstream());
			
			String pastaServidor = pasta;
			String[] nomeArquivo = event.getFileName().split("\\.");
			
			String caminhoServidorImagem = pastaServidor + System.getProperty("file.separator") + System.currentTimeMillis()+""+id+"."+nomeArquivo[1];
			String caminhoHtmlImagem = pasta + "/" + System.currentTimeMillis()+""+id+"."+nomeArquivo[1];

			salvarArquivo(caminhoServidorImagem, arquivo);
			
			return caminhoHtmlImagem;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	/**
	 * salva o arquivo na pasta do servidor
	 */
	//TODO
	public void salvarArquivo(String nomeArquivo, BufferedInputStream arquivo){
		try {
//			FacesContext context = FacesContext.getCurrentInstance();
//			String caminhoCompleto = context.getExternalContext().getRealPath("../wiclinicimages") + System.getProperty("file.separator") + nomeArquivo;
			
//			System.out.println("------------------------------------------------------");
			
			nomeArquivo = nomeArquivo.replace("/", System.getProperty("file.separator"));
			FacesContext fc = FacesContext.getCurrentInstance(); 
			ServletContext sc = (ServletContext) fc.getExternalContext().getContext();
			
			String caminhoAbsoluto = sc.getRealPath(BundleUtils.getValor("caminho.imagem"));
			
			if(caminhoAbsoluto == null){
				caminhoAbsoluto = BundleUtils.getValor("caminho.imagem.absoluto");
			}
			String caminhoCompleto = caminhoAbsoluto + System.getProperty("file.separator") + nomeArquivo;
			
//			System.out.println("Caminho completo ------> " + caminhoCompleto + " <-------");
			
			File file = new File(caminhoCompleto);
			File dir = file.getParentFile();
			
			if (!dir.exists())
				dir.mkdirs();
			
			BufferedInputStream bin = arquivo;
			FileOutputStream fileOutputStream = new FileOutputStream(caminhoCompleto);
			BufferedOutputStream bout = new BufferedOutputStream(fileOutputStream);
			
			int lido = bin.read();
			while(lido > -1){
				bout.write(lido);
				lido = bin.read();
			}
			
			bout.close();
			fileOutputStream.close();
			bin.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public String lerArquivoReceptor(String nomeArquivo, String pasta, FileItem arquivo, String caminhoAbsoluto){
		try {
			String extensao = nomeArquivo.split("\\.")[1];
			
			String caminhoServidorImagem = pasta + System.getProperty("file.separator") + System.currentTimeMillis()+"."+extensao;
			String caminhoHtmlImagem = pasta + "/" + System.currentTimeMillis()+"."+extensao;

			salvarArquivoReceptor(caminhoServidorImagem, arquivo, caminhoAbsoluto);
			
			return caminhoHtmlImagem;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	public void salvarArquivoReceptor(String caminhoServidorImagem, FileItem arquivo, String caminhoAbsoluto){
		try {
			
			caminhoServidorImagem = caminhoServidorImagem.replace("/", System.getProperty("file.separator"));
			
			if(caminhoAbsoluto == null){
				caminhoAbsoluto = BundleUtils.getValor("caminho.imagem.absoluto");
			}
			String caminhoCompleto = caminhoAbsoluto + System.getProperty("file.separator") + caminhoServidorImagem;
			
			File file = new File(caminhoCompleto);
			File dir = file.getParentFile();
			
			if (!dir.exists())
				dir.mkdirs();

			FileOutputStream fos = new FileOutputStream(file);
			fos.write(arquivo.get());
			fos.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
